package com.heima.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.heima.mapper.EmpExprMapper;
import com.heima.mapper.EmpMapper;
import com.heima.pojo.*;
import com.heima.service.EmpService;
import com.heima.utils.JwtUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static java.time.LocalDateTime.now;

@Service
public class EmpServiceImpl implements EmpService {
    @Autowired
    private EmpMapper empMapper;
    @Autowired
    private EmpExprMapper empExprMapper;

    /**
     * @param param 参数信息
     * @return
     */

    @Override
    public PageBean list(EmpQueryParam param) {
//        //在进入下一层之前应该在service层将计算处理好
//        // 计算总记录数
//        long count = empMapper.count();
//        //获取当前配置页的数据
//        //计算分页语句limit的开始索引
//        int start = (page - 1) * pageSize;
//        List<Emp> emps=empMapper.list(start, pageSize);
//        return new PageBean(count,emps);
        //设置分页参数
        PageHelper.startPage(param.getPage(), param.getPageSize());
        //执行查询  在这里调用一下查询方法,这里只对下面的第一行代码生效
        List<Emp> empList = empMapper.list(param);
        //把结果直接强转为Page<Emp>类型 PageHelper把数量和当前页的数据查询到后,封装到page对象中
        Page<Emp> p = (Page<Emp>) empList;
        //封装结果
        return new PageBean(p.getTotal(), p.getResult());
    }

    /**
     * 添加员工
     *
     * @param emp
     */
    @Override
    @Transactional
    public void add(Emp emp) {
        emp.setCreateTime(now());
        emp.setUpdateTime(now());
        //去数据库进行添加
        empMapper.add(emp);
        //经历的信息
        List<EmpExpr> empExprs = emp.getExprList();
        if (empExprs != null || !empExprs.isEmpty()) {
            empExprs.forEach(empExpr -> empExpr.setEmpId(emp.getId()));
            empExprMapper.addBatch(empExprs);
        }

    }

    /**
     * 批量删除员工
     * @param ids
     */
    @Transactional
    @Override
    public void delete(List<Integer> ids) {
        empExprMapper.delete(ids);
        empMapper.delete(ids);
    }

    /**
     * 根据id获取员工对象
     *
     * @param id
     * @return
     */
    @Override
    public Emp get(Integer id) {
        Emp emp=empMapper.get(id);
        return emp;
    }

    @Transactional
    @Override
    public void upDate(Emp emp) {
        //根据Id更新员工的基本信息
        emp.setUpdateTime(now());
        empMapper.updateById(emp);
//        2.根据Id删除员工的工作经历信息
        //先删除
        empExprMapper.delete(Arrays.asList(emp.getId()));
        //后更新
        empExprMapper.addBatch(emp.getExprList());
    }

    @Override
    public LogInfo login(Emp emp) {
        //这里方法名起login不合理 mapper层只和数据打交道,所以起名字要和信息有关
        LogInfo logInfo=empMapper.getEmpbyNameAndPassword(emp);
        //创建对象存储共享数据
        Map<String, Object> map=new HashMap<>();
        map.put("id",emp.getId());
        map.put("username",emp.getUsername());
        String jwt = JwtUtils.generateJwt(map);
        //下发令牌
        logInfo.setToken(jwt);
       return logInfo;
    }
}
